/**
 * 给定数组nums，找出所有符合a+b+c=0的不重复组合
 * @param nums 
 */
var threeSum = function (nums) {
    // 数组升序排序
    const result = []
    nums.sort((a, b) => {
        return a - b
    })
    // 遍历数组从 0 到 length-2
    // 防止越界
    for (let i = 0; i < nums.length - 2; i++) {
        // 如果当前数字等于前一个数字则跳过（防止重复）
        if (i === 0 || nums[i] !== nums[i - 1]) {
            // 如果不同则令i为第一个数，start=i+1（第二个数），end=length-1（第三个数）
            let start = i + 1, end = nums.length - 1
            // 第二个数超过第三个数则停止循环
            while (start < end) {
                // 查看i+start+end的和与0的大小，比0小则start++，比0大则end--  => 使结果靠近0
                if (nums[i] + nums[start] + nums[end] === 0) {
                    result.push([nums[i], nums[start], nums[end]])
                    start++
                    end--
                    while (start < end && nums[start] === nums[start - 1]) {
                        // 如果当前数字等于前一个数字则跳过
                        start++
                    }
                    while (start < end && nums[end] === nums[end + 1]) {
                        // 如果当前数字等于前一个数字则跳过
                        end--
                    }
                } else if (nums[i] + nums[start] + nums[end] < 0) {
                    // 增大和
                    start++
                } else {
                    // 减小和
                    end--
                }
            }
        }
    }
    return result
}